// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cc/input/layer_selection_bound.h"

#include "cc/proto/layer_selection_bound.pb.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/geometry/point.h"

namespace cc {
namespace {

    void VerifySerializeAndDeserializeProto(const LayerSelectionBound& bound1)
    {
        proto::LayerSelectionBound proto;
        bound1.ToProtobuf(&proto);
        LayerSelectionBound bound2;
        bound2.FromProtobuf(proto);
        EXPECT_EQ(bound1, bound2);
    }

    void VerifySerializeAndDeserializeLayerSelectionProto(
        const LayerSelection& selection1)
    {
        proto::LayerSelection proto;
        LayerSelectionToProtobuf(selection1, &proto);
        LayerSelection selection2;
        LayerSelectionFromProtobuf(&selection2, proto);
        EXPECT_EQ(selection1, selection2);
    }

    TEST(LayerSelectionBoundTest, AllTypePermutations)
    {
        LayerSelectionBound bound;
        bound.type = gfx::SelectionBound::LEFT;
        bound.edge_top = gfx::Point(3, 14);
        bound.edge_bottom = gfx::Point(6, 28);
        bound.layer_id = 42;

        VerifySerializeAndDeserializeProto(bound);
        bound.type = gfx::SelectionBound::RIGHT;
        VerifySerializeAndDeserializeProto(bound);
        bound.type = gfx::SelectionBound::CENTER;
        VerifySerializeAndDeserializeProto(bound);
        bound.type = gfx::SelectionBound::EMPTY;
        VerifySerializeAndDeserializeProto(bound);
    }

    TEST(LayerSelectionTest, AllSelectionPermutations)
    {
        LayerSelectionBound start;
        start.type = gfx::SelectionBound::LEFT;
        start.edge_top = gfx::Point(3, 14);
        start.edge_bottom = gfx::Point(6, 28);
        start.layer_id = 42;

        LayerSelectionBound end;
        end.type = gfx::SelectionBound::RIGHT;
        end.edge_top = gfx::Point(14, 3);
        end.edge_bottom = gfx::Point(28, 6);
        end.layer_id = 24;

        LayerSelection selection;
        selection.start = start;
        selection.end = end;
        selection.is_editable = true;
        selection.is_empty_text_form_control = true;

        VerifySerializeAndDeserializeLayerSelectionProto(selection);
        selection.is_empty_text_form_control = false;
        VerifySerializeAndDeserializeLayerSelectionProto(selection);
        selection.is_editable = false;
        VerifySerializeAndDeserializeLayerSelectionProto(selection);
        selection.is_empty_text_form_control = true;
        VerifySerializeAndDeserializeLayerSelectionProto(selection);
    }

} // namespace
} // namespace cc
